package com.nt.train.service.context;
import com.nt.train.service.PayStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
 * 支付策略控制类
 * @author hlf
 * @version 1.0
 * @date 2022/8/5 11:22
 */
@Component
public class PayStrategyContext {

//    @Autowired
//    List<PayStrategy> payStrategyList;
    /**
     * Autowired当使用在Collection里时，会将所申明类的所有实现类都放在那个指定的Collection里
     * 如果Autowired和map使用的话呢，它将它bean的名称作为key,所有的bean作为value
     */
//    @Autowired
//    Map<String, PayStrategy> payStrategyMap;

    private final Map<String, PayStrategy> strategyMap = new ConcurrentHashMap<String, PayStrategy>();

    /**
     * 构造函数，把spring容器中所有关于该接口的子类，全部放入到集合中
     * @param payStrategyList
     */
    @Autowired
    public PayStrategyContext(List<PayStrategy> payStrategyList) {
        for (PayStrategy payStrategy : payStrategyList) {
            strategyMap.put(payStrategy.getMode(), payStrategy);
        }
    }

    public void useStrategy(String mode, BigDecimal price) {
        PayStrategy strategy = this.strategyMap.get(mode);
        if (strategy == null) {
            throw new RuntimeException("支付方式有误，请检查");
        }
        strategy.pay(price);
    }
}
